package S12.second;
//根据要求完成(1)、(2)的代码编写
import java.util.HashMap;
import java.util.Map;
public class IDCard { //简化版的身份证类，这里仅处理地区编码对应的地址信息
	private static Map<Integer, Area> map=null; //需要编写静态代码块来对其进行初始化
	private static final RuntimeException ID_NULL=new RuntimeException("身份证号不能是null~");
	private static final RuntimeException AREA_ERROR=new RuntimeException("身份证地区编码不正确~");
	//(1)编写静态代码块，对静态变量map完成初始化，该变量可用于查询地区信息
	//地区编码文件内容可以通过Utils类的静态方法getAreaString()来获取
	static {
		map=new HashMap<Integer, Area>();
		String[] hs = Utils.getAreaString().split("\r\n");
		for(String h: hs) {
			String[] its = h.split("\t");
			int id=Integer.parseInt(its[0]);
			int pid=Integer.parseInt(its[1]);
			int bh=Integer.parseInt(its[3]);
			Area a=new Area(id,pid,its[2],bh);
			if(bh%100!=0)map.put(bh, a);//根据身份证前6位查询一行记录
			if(id<800 && bh%100==0)map.put(id, a);//用于pid的值进行递归查询
			// 河南省郑州市金水区
		}
	}
	/**
	 * (2)实现getAddress()方法的功能，可以根据身份证号获取其地址信息
	 * @param idNumber 身份证号，这里为简化不考虑长度，但至少提供6位数字地区编码
	 * @return 返回地址信息，若(1)参数是null，则抛出ID_NULL异常，若(2)参数长度不足6位 (3)地区编码包含非数字 (4)地区编码不存在，则抛出AREA_ERROR异常
	 */
	public static String getAddress(String idNumber) {
		if(idNumber==null)throw ID_NULL;
		try {
			int id, bh = Integer.parseInt(idNumber.substring(0, 6));
			Area a = map.get(bh);
			if(a==null) throw AREA_ERROR;
			String address=a.getArea();//金水区
			while((id=a.getPid())!=0) {
				a=map.get(id);
				address=a.getArea()+address;
			}
			return address;
		}catch(Exception e) {
			throw AREA_ERROR;
		}
	}
}
